package com.qcby.demo.proxyaop.interceptor;

import com.qcby.demo.proxyaop.proxy.star.JiaLing;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @className: InterceptorHandler
 * @description: 拦截器的动态代理类
 * @author: lxt
 * @create: 2021-05-12 16:07
 **/
public class InterceptorHandler implements InvocationHandler {

    //代理逻辑内添加一个真实对象的引用，从而实现代理逻辑与真实对象的绑定
    private Object target = null;
    //现在的代理逻辑类加入了一个我们设计好的拦截器，用来更好地帮我们丰富代理逻辑
    private Interceptor qcbyInterceptor = null;

    //绑定真实对象和拦截器
    public InterceptorHandler(Object target, Interceptor qcbyInterceptor) {
        this.target = target;
        this.qcbyInterceptor = qcbyInterceptor;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (qcbyInterceptor == null) {
            //如果没有给代理逻辑类配置一个拦截器的话，则直接反射真实对象的方法
            return method.invoke(target, args);
        }
        Object r = null;
        try {
            if (!qcbyInterceptor.preHandle(proxy, target, method, args)) {
                // 无需执行目标方法，拦截器验证未通过
                return r;
            }
            r = method.invoke(target, args);
            //目标方法执行完毕，后处理
            qcbyInterceptor.postHandle(proxy, target, method, args);
        }catch (Exception e){
            // 打印堆栈跟踪信息
            e.printStackTrace();
        }finally {
            //一定会被调用
            qcbyInterceptor.afterCompletion(proxy, target, method, args);
        }
            return r;
    }
}
